package algorithmExample;

/**
 * @author: zhang.rongqing
 * @since: 2019/10/23
 */
//给出两个 非空 的链表用来表示两个非负的整数。其中，它们各自的位数是按照 逆序 的方式存储的，并且它们的每个节点只能存储 一位 数字。
//
//        如果，我们将这两个数相加起来，则会返回一个新的链表来表示它们的和。
//
//        您可以假设除了数字 0 之外，这两个数都不会以 0 开头。
//
//        示例：
//
//        输入：(2 -> 4 -> 3) + (5 -> 6 -> 4)
//        输出：7 -> 0 -> 8
//        原因：342 + 465 = 807

public class AddTwoNumbers {

    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int a = l1.next.next.val * 100 + l1.next.val * 10 + l1.val;
        int b = l2.next.next.val * 100 + l2.next.val * 10 + l2.val;
        int c = a + b;
        ListNode result = new ListNode(c / 100);
        result.next = new ListNode((c - c / 100 * 100) / 10);
        result.next.next = new ListNode(c - c / 100 * 100 - (c - c / 100 * 100) / 10 * 10);
        return result;
    }

    public ListNode addTwoNumbers2(ListNode l1, ListNode l2) {
        int a = l1.next.next.val * 100 + l1.next.val * 10 + l1.val;
        int b = l2.next.next.val * 100 + l2.next.val * 10 + l2.val;
        int c = a + b;
        ListNode result = new ListNode(c / 100);
        result.next = new ListNode((c - c / 100 * 100) / 10);
        result.next.next = new ListNode(c - c / 100 * 100 - (c - c / 100 * 100) / 10 * 10);
        return result;
    }

    public ListNode addTwoNumbers3(ListNode l1, ListNode l2) {
        ListNode result = new ListNode(0);
        ListNode curr = result;
        ListNode p = l1;
        ListNode q = l2;
        int flag = 0;
        while (p != null || q != null) {
            int a = (p != null) ? p.val : 0;
            int b = (q != null) ? q.val : 0;
            int value = a + b + flag;
            flag = 0;
            curr.next = new ListNode(value % 10);
            if (value >= 10) {
                flag = 1;
            }
            curr = curr.next;
            if (p != null) {
                p = p.next;
            }
            if (q != null) {
                q = q.next;
            }
        }
        if (flag > 0) {
            curr.next = new ListNode(flag);
        }

        return result.next;
    }

    static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(2);
        listNode1.next = new ListNode(3);
        listNode1.next.next = new ListNode(5);

        ListNode listNode2 = new ListNode(2);
        listNode2.next = new ListNode(3);
        listNode2.next.next = new ListNode(5);
        ;
        AddTwoNumbers addTwoNumbers = new AddTwoNumbers();
        ListNode result = addTwoNumbers.addTwoNumbers3(listNode1, listNode2);
        System.out.println(String.format("value:%s%s%s", result.next.next.val, result.next.val, result.val));
//        System.out.println(listNode1.next.val);
    }
}
